import json
import os
import random  # 新增：用于打乱数据
from pathlib import Path

def merge_json_files(input_dir, output_file, removed_output_file, duplicate_output_file, shuffle=True):
    """
    合并目录中的所有JSON文件，过滤无效数据并去重，支持在保存前打乱数据。

    Args:
        input_dir (str): 输入目录路径。
        output_file (str): 输出文件路径（保留有效且不重复的数据）。
        removed_output_file (str): 保存被tag为空移除的数据。
        duplicate_output_file (str): 保存因'id'重复而被移除的数据。
        shuffle (bool): 是否在保存前打乱有效数据（默认True）。
    """
    merged_data = []          # 存储有效且不重复的数据
    removed_data_tag_empty = [] # 存储因tag为空而被移除的数据
    removed_data_duplicate_id = [] # 存储因id重复而被移除的数据
    
    seen_ids = set()          # 用于存储已处理的ID，实现查重
    
    processed_files = 0
    removed_count_tag_empty = 0
    removed_count_duplicate_id = 0
    valid_count = 0

    print(f"开始合并和处理 {input_dir} 中的JSON文件...")

    # 遍历输入目录中的所有JSON文件
    for filename in os.listdir(input_dir):
        if filename.endswith('.json'):
            file_path = os.path.join(input_dir, filename)
            print(f"  正在处理文件: {filename}")
            try:
                with open(file_path, 'r', encoding='utf-8') as f:
                    data = json.load(f)

                items_to_process = []
                if isinstance(data, list):
                    items_to_process = data
                elif isinstance(data, dict) and "list" in data:
                    items_to_process = data["list"]
                else:
                    print(f"警告: 文件 {filename} 的结构不符合要求，跳过。")
                    continue
                
                processed_files += 1

                for item in items_to_process:
                    item_id = item.get("id")
                    item_tag = item.get("tag", "").strip()

                    if not item_tag:
                        removed_data_tag_empty.append(item)
                        removed_count_tag_empty += 1
                    elif item_id is None:
                        merged_data.append(item)
                        valid_count += 1
                    elif item_id in seen_ids:
                        removed_data_duplicate_id.append(item)
                        removed_count_duplicate_id += 1
                    else:
                        merged_data.append(item)
                        seen_ids.add(item_id)
                        valid_count += 1

            except json.JSONDecodeError as e:
                print(f"处理文件 {filename} 时JSON解码错误: {str(e)}")
            except Exception as e:
                print(f"处理文件 {filename} 时发生错误: {str(e)}")
    
    # --- 新增：打乱有效数据 ---
    if shuffle and merged_data:
        # 设置随机种子，确保打乱结果可复现（可选）
        random.seed(42)  # 固定种子，每次运行打乱结果相同；注释则每次不同
        random.shuffle(merged_data)
        print(f"已对 {len(merged_data)} 条有效数据进行打乱")
    
    # 确保输出目录存在
    for path in [output_file, removed_output_file, duplicate_output_file]:
        Path(Path(path).parent).mkdir(parents=True, exist_ok=True)

    # 保存合并后的有效数据（已打乱）
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(merged_data, f, ensure_ascii=False, indent=2)
        print(f"合并后有效且不重复条目数: {valid_count} (保存到 {output_file})")
    except Exception as e:
        print(f"保存文件 {output_file} 时出错: {str(e)}")
    
    # 保存被移除的数据（不打乱，保持原始顺序）
    try:
        with open(removed_output_file, 'w', encoding='utf-8') as f:
            json.dump(removed_data_tag_empty, f, ensure_ascii=False, indent=2)
        print(f"已移除tag为空的条目数: {removed_count_tag_empty} (保存到 {removed_output_file})")
    except Exception as e:
        print(f"保存文件 {removed_output_file} 时出错: {str(e)}")

    try:
        with open(duplicate_output_file, 'w', encoding='utf-8') as f:
            json.dump(removed_data_duplicate_id, f, ensure_ascii=False, indent=2)
        print(f"已移除ID重复的条目数: {removed_count_duplicate_id} (保存到 {duplicate_output_file})")
    except Exception as e:
        print(f"保存文件 {duplicate_output_file} 时出错: {str(e)}")
    
    print(f"\n处理完成！总共处理文件数: {processed_files}")


if __name__ == "__main__":
    # 配置输入输出路径
    input_directory = "jsons_GZ_new_Pro"    # 存放JSON文件的目录
    output_file = "merged_output_GZ.json"          # 合并后的输出文件（有效且不重复数据）
    removed_output_file = "gzremoved_data_tag_empty_Store.json" # 被移除的数据文件 (tag为空)
    duplicate_output_file = "gzremoved_data_duplicate_id.json" # 被移除的数据文件 (ID重复)
    
    if not os.path.exists(input_directory):
        print(f"错误：输入目录 '{input_directory}' 不存在。")
    else:
        # 调用时可控制是否打乱（默认打乱）
        merge_json_files(
            input_directory, 
            output_file, 
            removed_output_file, 
            duplicate_output_file,
            shuffle=True  # 启用打乱
        )